package net.crozz.openapi.weibo;

import com.google.gson.reflect.TypeToken;
import net.crozz.openapi.ApiException;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;

import java.util.List;
import java.util.Map;

public class Common {

    private Requester client;
    private String    baseURL;

    Common(Requester client, String baseURL) {
        this.client = client;
        this.baseURL = baseURL;
    }

    /**
     * 获取国家列表<br/>
     * http://open.weibo.com/wiki/2/common/get_country
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param capital      省份的首字母，a-z，可为空代表返回全部，默认为全部
     * @param language     返回的语言版本，zh-cn：简体中文、zh-tw：繁体中文、english：英文，默认为zh-cn
     *
     * @throws ApiException
     */
    public List<Map<String, String>> get_country(
            String source,
            String access_token,
            String capital,
            String language
    ) throws ApiException {
        return client.getObj(
                new TypeToken<List<Map<String, String>>>() {}.getType(),
                baseURL + "common/get_country.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("capital", capital),
                Param.newParam("language", language)
        );
    }

    /**
     * 获取省份列表<br/>
     * http://open.weibo.com/wiki/2/common/get_province
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param country      国家的国家代码
     * @param capital      省份的首字母，a-z，可为空代表返回全部，默认为全部
     * @param language     返回的语言版本，zh-cn：简体中文、zh-tw：繁体中文、english：英文，默认为zh-cn
     *
     * @throws ApiException
     */
    public List<Map<String, String>> get_province(
            String source,
            String access_token,
            String country,
            String capital,
            String language
    ) throws ApiException {
        return client.getObj(
                new TypeToken<List<Map<String, String>>>() {}.getType(),
                baseURL + "common/get_province.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("country", country),
                Param.newParam("capital", capital),
                Param.newParam("language", language)
        );
    }

    /**
     * 获取城市列表<br/>
     * http://open.weibo.com/wiki/2/common/get_city
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param province     省份的省份代码
     * @param capital      省份的首字母，a-z，可为空代表返回全部，默认为全部
     * @param language     返回的语言版本，zh-cn：简体中文、zh-tw：繁体中文、english：英文，默认为zh-cn
     *
     * @throws ApiException
     */
    public List<Map<String, String>> get_city(
            String source,
            String access_token,
            String province,
            String capital,
            String language
    ) throws ApiException {
        return client.getObj(
                new TypeToken<List<Map<String, String>>>() {
                }.getType(),
                baseURL + "common/get_city.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("province", province),
                Param.newParam("capital", capital),
                Param.newParam("language", language)
        );
    }

    /**
     * 通过地址编码获取地址名称<br/>
     * http://open.weibo.com/wiki/2/common/code_to_location
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param codes        需要查询的地址编码，多个之间用逗号分隔
     *
     * @throws ApiException
     */
    public List<Map<String, String>> code_to_location(String source, String access_token, String codes) throws ApiException {
        return client.getObj(
                new TypeToken<List<Map<String, String>>>() {
                }.getType(),
                baseURL + "common/code_to_location.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("codes", codes)
        );
    }

    /**
     * 获取时区配置表<br/>
     * http://open.weibo.com/wiki/2/common/get_timezone
     *
     * @param source       采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
     * @param access_token 采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
     * @param language     返回的语言版本，zh-cn：简体中文、zh-tw：繁体中文、english：英文，默认为zh-cn
     *
     * @throws ApiException
     */
    public Map<String, String> get_timezone(String source, String access_token, String language) throws ApiException {
        return client.getObj(
                new TypeToken<Map<String, String>>() {
                }.getType(),
                baseURL + "common/get_timezone.json",
                Param.newParam("source", source),
                Param.newParam("access_token", access_token),
                Param.newParam("language", language)
        );
    }

}
